﻿#include "FITKAssInstanceTR.h"
#include "FITK_Kernel/FITKCore/FITKVec3DAlg.h"
 

namespace Interface
{
    void FITKAssemblyInstanceTR::setTransform(const double x, const double y, const double z)
    {
        //平移矢量
        _trans[0] = x;
        _trans[1] = y;
        _trans[2] = z;
    }

    void FITKAssemblyInstanceTR::setRotateAxis(double* p1, double* p2)
    {
        //旋转轴第一点与第二点
        for (int i = 0; i < 3; ++i )
        {
            _rotate1[i] = p1[i];
            _rotate2[i] = p2[i];
        }
    }

    void FITKAssemblyInstanceTR::setAngle(double a)
    {
        //旋转角度
        _angle = a;
    }

    void FITKAssemblyInstanceTR::getTransfom(double* transform) const
    {
        for (int i = 0; i < 3; ++i)
        {
            transform[i] = _trans[i];
        }
    }

    void FITKAssemblyInstanceTR::getRotateAxis(double* p1, double* p2) const
    {
        //旋转轴第一点与第二点
        for (int i = 0; i < 3; ++i)
        {
            p1[i] = _rotate1[i];
            p2[i] = _rotate2[i];
        }
    }

    double FITKAssemblyInstanceTR::getAngle() const
    {
        return _angle;
    }

    bool FITKAssemblyInstanceTR::getPointCoor(int pointID, double* coor, int modelIndex /*= 0*/)
    {
        FITKAbstractModel* model = this->getModel();
        if (model == nullptr) return false;
        //部件坐标
        double pt[3] = { 0,0,0 };
        bool ok = model->getPointCoor(pointID, pt, modelIndex);
        if (!ok) return false;
        //空间变换
        //计算轴线
        double axis[3] = { 0,0,0 };
        for (int i = 0; i < 3; ++i) axis[i] = _rotate2[i] - _rotate1[i];
        //旋转
        Core::FITKPoint FKp(pt);
        Core::FITKVec3D FKAxis(axis);
        Core::FITKPoint res = Core::RotateAroundAxis(FKp, FKAxis, _angle*FITK_PI /180.0);
        res.getCoor(pt);
        //平移
        for (int i = 0; i < 3; ++i)  
            coor[i] = pt[i] + _trans[i];

        return true;
    }


}
